/**
 * 给定一个X数组，一个A数组。每次操作令:
 * A[next] =  A[cur][Xi]
 * 求对数组A操作K次以后的结果，K在1E18。显然要找循环节或者倍增。
 * 用倍增比较好？
 * 令Dji是位置i经过1<<j后的操作，则
 * D0i = Xi
 * Dji = D[j-1][D[i][j-1]]
 * 令 d 是 Dj, pre是D[j-1]， 即 d[i] = pre[pre[i]]
 * 预处理以后，再求答案。用快速幂的方法即可
 * if k 是奇数，令 pos = D[j][pos]
 * 然后 j += 1，相当于倍增
 * 
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;

int N;
llt K;

vi X;
vi A;
vector<vi> D;

void work(){
    cin >> N >> K;
    X.assign(N + 1, {});
    for(int i=1;i<=N;++i) cin >> X[i];
    A.assign(N + 1, {});
    for(int i=1;i<=N;++i) {
        cin >> A[i];
    }
    
    D.assign(61, vi(N + 1, 0));
    for(int i=1;i<=N;++i){
        D[0][i] = X[i];
    }
    for(int j=1;j<61;++j){
        const auto & pre = D[j - 1];
        auto & d = D[j];
        for(int i=1;i<=N;++i){        
            d[i] = pre[pre[i]];
        }
    }
#ifndef ONLINE_JUDGE
    cout << "origin: " << endl;
    for(int i=1;i<=N;++i){
        cout << A[i] << " ";
    }
    cout << endl;
    for(int j=0;j<=2;++j){
        cout << "after " << (1<<j) << " op:\n";
        for(int i=1;i<=N;++i){
            cout << A[D[j][i]] << " ";
        }
        cout << endl;
    }
#endif

    for(int i=1;i<=N;++i){
        llt k = K;
        int pos = i;
        for(int j=0;k;k>>=1,++j){
            if(k & 1){
                pos = D[j][pos];
            }
        }
        cout << A[pos] << " ";
    }
    cout << "\n";    
    return;
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}